/*******************************************************************************
 * Package: com.song.boot.springstudy.webflux
 * Type:    Combination
 * Date:    2025-04-06 21:00
 *
 * Copyright (c) 2025 LTD All Rights Reserved.
 *
 * You may not use this file except in compliance with the License.
 *******************************************************************************/
package com.song.boot.springstudy.webflux;

import lombok.SneakyThrows;
import reactor.core.publisher.Flux;

import java.util.concurrent.TimeUnit;

/**
 * 功能描述： 组合操作（Combination）
 * 将多个流合并为一个流。
 *
 * @author Songxianyang
 * @date 2025-04-06 21:00
 */
public class Combination {

    @SneakyThrows
    public static void main(String[] args) {
        Flux<Integer> just = Flux.just(3, 99, 2);
        Flux<Integer> just1 = Flux.just(31, 30, 20);
        // merge：无序合并多个流（元素按实际到达顺序）。
        Flux.merge(just, just1)
                .subscribe(System.out::print);


        System.out.println("---------------");
        // concat：按顺序合并流（先消费完第一个流，再处理下一个）
        // Flux.concat 方法实现的顺序输出是指先处理完第一个 Flux 中的所有元素，再处理第二个 Flux 中的元素，也就是先执行 just 再执行 just1，而不是对内部数据进行排序后输出
        Flux.concat(just, just1)
                .subscribe(System.out::print);
        System.out.println("---------------");
        //zip：将多个流的元素一一配对（类似拉链）。
        Flux.zip(just, just1
                , (a, b) -> a + ":" + b
        ).subscribe(System.out::println);
        System.out.println("--------------");
        // 当任一流发出新元素时，组合所有流的最新值
        Flux.combineLatest(
                just, just1,
                (a, b) -> a + ":" + b
        ).subscribe(System.out::println);
        TimeUnit.SECONDS.sleep(3);
    }

}
